package com.sojson.project.monitor.job.entity.po;

import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sojson.base.impl.BaseLogicDelBean;
import com.sojson.enums.core.EGeneralStatus;
import com.sojson.enums.core.EGeneralYesNo;
import com.sojson.util.StringUtil;
import com.sojson.util.job.CronUtil;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 定时任务调度表Bean
 * 
 * @author liu
 * @date 2022-10-24
 */
@Data
@ApiModel("定时任务调度表Bean")
@TableName("sys_job")
public class Job extends BaseLogicDelBean {

    private static final long serialVersionUID = 1L;
    /** ID */
    @ApiModelProperty("ID")
    private String id;
    /** 任务名称 */
    @ApiModelProperty("任务名称")
    private String name;
    /** 任务组名 */
    @TableField("`GROUP`")
    @ApiModelProperty("任务组名")
    private String group;
    /** 调用目标字符串(Controller下的任何方法,格式:mapping.methodName('ry', true, 2000L, 316.50D, 100)(Controller类路径).(方法名)(参数列表)) */
    @ApiModelProperty("调用目标字符串(Controller下的任何方法,格式:mapping.methodName('ry', true, 2000L, 316.50D, 100)(Controller类路径).(方法名)(参数列表))")
    private String invokeTarget;
    /** cron执行表达式 */
    @ApiModelProperty("cron执行表达式")
    private String cronExpression;
    /** cron错过策略(0:默认,1:将错过的全部执行一次,2:将上一次错过的立即执行一次,3:错过的放弃执行) */
    @ApiModelProperty("cron错过策略(0:默认,1:将错过的全部执行一次,2:将上一次错过的立即执行一次,3:错过的放弃执行)")
    private Integer misfirePolicy;
    /** 是否并发执行(1允许 2禁止) */
    @ApiModelProperty("是否并发执行(1允许 2禁止)")
    private Integer concurrent;
    /** 任务状态(1正常 2暂停) */
    @ApiModelProperty("任务状态(1正常 2暂停)")
    private Integer status;
    /** 备注 */
    @ApiModelProperty("备注")
    private String remark;

    public Job() {

    }

    public Date getNextValidTime() {
        if (StringUtil.isNotEmpty(cronExpression)) {
            return CronUtil.getNextExecution(cronExpression);
        }
        return null;
    }

    /**
     * 插入初始化
     */
    public void insertInit() {
        if (StringUtil.isBlank(getConcurrent())) {
            setConcurrent(EGeneralYesNo.YES.getCode());
        }
        if (StringUtil.isBlank(getStatus())) {
            setStatus(EGeneralStatus.NORMAL.getCode());
        }
    }

}